#define _GNU_SOURCE
#include "daemon_runner.h"
#include "daemon_sub_process.h"
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>

static int is_running = 1;

static SubProcess *sub_processes[SUB_PRO_COUNT];
static char *cmd_params[SUB_PRO_COUNT] = {"app", "ota"};

static void exit_handler(int signo)
{
    is_running = 0;
}

int daemon_runner_run()
{
    // 将当前进程变成守护进程
    // 参数1：0：将程序的运行目录指定为系统根目录，1：当前目录
    // 参数2：0：自动关闭标准输入输出，并重定向到/dev/null， 1：不关闭标准输入输出
    daemon(0, 1);

    // 将输出重定向到日志文件
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
    close(STDIN_FILENO);
    open("/dev/null", O_RDWR); // 标准输入   完全不用标准输入
    open(LOG_FILE_PATH, O_CREAT|O_WRONLY|O_APPEND, 0644); // 标准输出
    open(LOG_FILE_PATH, O_CREAT|O_WRONLY|O_APPEND, 0644); // 标准错误

    // 注册一个kill结束的信号处理函数
    signal(SIGTERM, exit_handler);

    // 初始化所有子进程
    for (int i = 0; i < SUB_PRO_COUNT; i++)
    {
        sub_processes[i] = daemon_sub_process_init(cmd_params[i]);
    }
    
    // 每隔3秒检查启动所有子进程
    while (is_running)
    {
        for (int i = 0; i < SUB_PRO_COUNT; i++)
        {
            daemon_sub_process_checkStart(sub_processes[i]);
        }
        sleep(3);
    }
    

    // 停止所有子进程
    for (int i = 0; i < SUB_PRO_COUNT; i++)
    {
        daemon_sub_process_stop(sub_processes[i]);
    }

    return 0;
}